package com.jxm.linear;

import sun.dc.pr.PRError;

import java.util.Iterator;

/**
 * @Author: jxm
 * @Description: 顺序表 TODO 有问题
 * @Date: 2022/6/10 9:55
 * @Version: 1.0
 */
public class SequenceList<T> implements Iterable<T> {

    private T[] eles; //存储元素的数组
    private int N; //当前线性表的长度

    public SequenceList(int capacity){
        //初始化数组
        this.eles = (T[])new Object[capacity];
        //初始化长度
        this.N = 0;
    }

    public SequenceList(){}

    //空置线性表
    public void clear(){
        this.N = 0;
    }

    //判断线性表是否为空，是返回true，否返回false
    public boolean isEmpty(){
        return this.N == 0;
    }

    //获取线性表中元素的个数
    public int length(){
        return this.N;
    }

    //读取并返回线性表中的第i个元素的值
    public T get(int i){

        return eles[i];
    }

    //在线性表的第i个元素之前插入一个值为t的数据元素。
    public void insert(int i,T t){
        //扩容
        if(N == eles.length){
            resize(2*eles.length);
        }
        //先把i索引处的元素及其后面的元素依次向后移动一位
        for (int index=N;index>i;index--){
            eles[index] = eles[index-1];
        }
        //把t元素放到i索引处即可
        eles[i] = t;
        //元素+1
        N++;
    }

    //向线性表中添加一个元素t
    public void insert(T t){
        if(N == eles.length){
            resize(2*eles.length);
        }
        eles[N++] = t;
    }

    //删除并返回线性表中第i个数据元素。
    public T remove(int i){
        //记录索引处的值
        T current = eles[i];
        //索引i后面元素依次向前移动一位即可
        for (int index = i;index < N-1;index ++){
            eles[index] = eles[index + 1];
        }
        //元素个数-1
        N--;
        //缩容
        if(N<eles.length/4){
            resize(eles.length/2);
        }
        return current;
    }

    //返回线性表中首次出现的指定的数据元素的位序号，若不存在，则返 回-1。
    public int indexOf(T t){
        for (int i=0;i<N-1;i++){
            if(eles[i].equals(t)){
                return i;
            }
        }
        return -1;
    }

    //根据参数newSize;重置eles大小
    public void resize(int newSize){
        //定义一个临时数组
        T[] temp = eles;
        //创建新数组
        eles = (T[])new Object[newSize];
        //把原数组数据拷贝到新数组中
        for (int i=0;i<eles.length;i++){
            eles[i] = temp[i];
        }
    }


    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator{

        private int cusor;

        private SIterator(){
            //初始化从第0个开始遍历
            this.cusor = 0;
        }

        //判断是否有下一个元素
        @Override
        public boolean hasNext() {
            return cusor<N;
        }

        //返回下一个元素
        @Override
        public Object next() {
            return eles[cusor++];
        }
    }
}
